import os
import shutil
import glob
import sys
import re  # re模块为高级字符串处理提供了正则表达式工具
import math  # 为浮点运算提供了对底层C函数库的访问
import random  # random提供了生成随机数的工具。
import datetime  # 日期模块
import zlib  # 数据压缩模块
import timeit  # 时间度量
import doctest  # 测试模块  扫描模块并根据程序中内嵌的文档字符串执行测试
import unittest  # unittest模块不像 doctest模块那么容易使用，不过它可以在一个独立的文件里提供一个更全面的测试集
from urllib.request import urlopen
from urllib.parse import urlencode
from urllib.request import Request


# Python3 标准库概览

# os模块提供了不少与操作系统相关联的函数
# 针对日常的文件和目录管理任务， shutil 模块提供了一个易于使用的高级接口


def os_demo():
    print(f'返回当前的工作目录 :{os.getcwd()}')
    os.chdir('/pyproject')  # 修改当前的工作目录或者说操作路径
    # os.system('mkdir today')  # 执行系统命令 mkdir
    # os.system('rmdir today')

    # shutil.copyfile('data.db', 'archive.db')
    # shutil.move('/build/executables', 'installdir')
    findfile = glob.glob('*.py')
    print(f'{findfile}')

    # 这些命令行参数以链表形式存储于 sys 模块的 argv 变量 python demo.py one two three 然后sys.argv打印得到one two three
    print(sys.argv)


def random_simp():
    # 使用正则表达式 查找元素
    result = re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest but')
    print(f'find result :{result}')

    # 从给定的列表中随机选一个
    result = random.choice(['apple', 'pear', 'banana'])
    print(f'choice result :{result}')

    # 从1-100中随机抽取10个元素
    result = random.sample(range(100), 10)
    print(f'choice result :{result}')

    # 得到一个浮点数据
    random.random()

    # 随机得到1-6中的正数
    random.randrange(6)


def date_simp():
    # 得到当前日期
    now = datetime.date.today()
    print(f'now : {now}')

    # 计算给定日期之差
    date1 = datetime.date(2022, 11, 2)
    print(f'已经过去{(now - date1).days}天了')

    # 今天
    today = datetime.date.today()
    # 昨天
    yesterday = today - datetime.timedelta(days=1)
    # 上个月
    last_month = today.month - 1 if today.month - 1 else 12
    # 当前时间戳
    time_stamp = datetime.time.time()
    # 时间戳转datetime
    datetime.datetime.fromtimestamp(time_stamp)
    # datetime转时间戳
    int(datetime.time.mktime(today.timetuple()))
    # datetime转字符串
    today_str = today.strftime("%Y-%m-%d")
    # 字符串转datetime
    today = datetime.datetime.strptime(today_str, "%Y-%m-%d")
    # 补时差
    today + datetime.timedelta(hours=8)


# urllib 模块
def request_simp():
    # 模拟get请求
    url = 'http://www.xxx.com/login'
    data = {"username": "admin", "password": 123456}
    req_data = urlencode(data)  # 将字典类型的请求数据转变为url编码
    res = urlopen(url + '?' + req_data)  # 通过urlopen方法访问拼接好的url
    res = res.read().decode()  # read()方法是读取返回数据内容，decode是转换返回数据的bytes格式为str
    print(res)

    # 模拟post请求
    url = 'http://www.xxx.com/login'
    data = {"username": "admin", "password": 123456}
    data = urlencode(data)  # 将字典类型的请求数据转变为url编码
    data = data.encode('ascii')  # 将url编码类型的请求数据转变为bytes类型
    req_data = Request(url, data)  # 将url和请求数据处理为一个Request对象，供urlopen调用
    with urlopen(req_data) as res:
        res = res.read().decode()  # read()方法是读取返回数据内容，decode是转换返回数据的bytes格式为str

    print(res)


def test_sum(a, b):
    """
    >>> test_sum(2,3)
    5
    """
    assert a % 2 == 0
    assert a % 2 == 0
    return a + b


class TestDemo(unittest.TestCase):

    def test_average(self):
        self.assertEqual(40, 40.0)
        self.assertEqual(random.randrange(6), 4.3)

    def test_sum(self):
        self.assertEqual(40, 40.0)

if __name__ == '__main__':
    # os_demo()

    # 随机生成数据
    # random_simp()

    # 日期示例
    # date_simp

    # 模拟发送请求
    # request_simp()

    # 自动测试方法，不用传参
    # print(f'自动测试结果：{doctest.testmod(name="test_sum",verbose=True)}')

    # 了解单元测试 https://blog.csdn.net/ccyzq/article/details/122304588
    unittest.main()
